package chatNI;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import chatControler.ChatControler;
import chatGUI.BarreProgression;
import chatModel.*;

/**
 * Thread qui reçoit le fichier
 * 
 */
public class ThreadTcpRecup extends Thread{
	
	private ServerSocket serverSocket;
	private File file;
	private ChatControler chatControler;
	private UtilisateurDistant user;
	private BarreProgression fenBarProg;
	private long lengthFile;
        
        /**
         * Constructeur
         * @param serverSocket Socket dans lequel va passer le fichier
         * @param file Fichier dans lequel seront stockées les données reçues
         * @param chatControler ChatControler du ChatSystem pour l'avertir de m'état du transfert
         * @param user Utilisateur distant qui envoie sont fichier
         * @param lengthFile Taille du fichier
         */
	public ThreadTcpRecup(ServerSocket serverSocket, File file, ChatControler chatControler, UtilisateurDistant user, long lengthFile) {
		this.serverSocket = serverSocket;
		this.file=file;
		this.chatControler = chatControler;
		this.user=user;
		this.fenBarProg = new BarreProgression(this.file.getName());
		this.lengthFile=lengthFile;

	}
	
        /**
         * Démarre le Thread
         * @see chatGUI.BarreProgression BarreProgression
         */
	public void run(){
		this.fenBarProg.pack();
		this.fenBarProg.setVisible(true);
		System.out.println("taille fichier : " +this.lengthFile);
		rcvFile( this.serverSocket, this.file, this.lengthFile);
		try {
			this.serverSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
        /**
         * Reçoit le fichier
         * @see chatGUI.BarreProgression BarreProgression
         * @param serverSocket Socket dans lequel passe le fichier
         * @param file Fichier dans lequel seront stockées les données reçues
         * @param lengthFile Taille du fichier
         */
	public void rcvFile(ServerSocket serverSocket, File file, long lengthFile){
		Socket echange_donnee=null;
		InputStream fichierDEntree=null;
		OutputStream fichierDeSortie=null;
		
		try {
			echange_donnee=serverSocket.accept();
			fichierDEntree = echange_donnee.getInputStream();
			fichierDeSortie = new FileOutputStream(file);
			
			byte[] toRcv = new byte[1024];
			int passage=0;
			int value=5;
			int i;
			while (( i = fichierDEntree.read(toRcv)) != -1){
				fichierDeSortie.write(toRcv, 0, i);
				passage++;
				if((passage*1024)>=(lengthFile*value/100)){
					this.fenBarProg.progressbar.setValue(value);
					value=value+5;
				}
			}
			this.fenBarProg.progressbar.setValue(100);
			System.out.println("nb passage : " + passage);
			
		} catch (IOException e) {
			System.out.println("probleme avec l'accept de la socket");
			e.printStackTrace();
		}
		finally{
			try {
				fichierDEntree.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				fichierDeSortie.flush();
				fichierDeSortie.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				echange_donnee.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			this.chatControler.fichierRecu(user);
		}
		
	}
	

}
